﻿using System;
namespace GX
{
    /**
         * 1.发出去的完整数据包有  包头+包体
         * 2.包头2个字节，表示包体的长度
         * 3.包体有4部分：
         *  唯一值：2个字节
         *  模块号：1个字节
         *  协议号：1个字节
         *  数据：n个字节
         * 4.其中模块号和协议号一起组合成1个ushort类型，表示协议包的ID
         */
    public class PackageOut : ByteStream, IPackageOut
    {
        private static int uniq = 99;
        byte _way;
        byte _frame;

        public void InitHead(byte frame, byte way)
        {
            _frame = frame;
            _way = way;
            /**
             * 协议头:2 BYTE
             * 表示协议体的的长度：协议ID+协议内容
             */
            this.WriteUShort(0);
            /**协议唯一值：检测玩家发包
             */
            this.WriteUShort(0);
            /**
             * 协议的ID
             */
            this.WriteByte(this._frame);
            this.WriteByte(this._way);
        }
        public ushort code
        {
            get
            {
                return NetConfig.GetCode(_frame, _way);
            }
        }
        public byte frame
        {
            get
            {
                return (byte)0;
            }
        }
        public byte way
        {
            get
            {
                return (byte)0;
            }
        }
        internal void BeforeSendOut()
        {
            /**
             * 去掉头的长度
             */
            ushort len = (ushort)(this.length - 2);

            byte[] bytes = BitConverter.GetBytes(len);

            this[0] = bytes[1];
            this[1] = bytes[0];


            if (PackageOut.uniq > 65535)
            {
                PackageOut.uniq = 99;
            }
            ++PackageOut.uniq;
            bytes = BitConverter.GetBytes((ushort)PackageOut.uniq);
            this[2] = bytes[1];
            this[3] = bytes[0];
        }
    }//END CLASS
}